package com.bupt.vueblog.dao;

import com.bupt.vueblog.domain.dto.ArticleSelectDTO;
import com.bupt.vueblog.domain.dto.DetailInfoDTO;
import com.bupt.vueblog.domain.dto.ChangeNumDTO;
import com.bupt.vueblog.domain.entity.BriefArticle;
import com.bupt.vueblog.domain.vo.BriefArticleVO;
import com.bupt.vueblog.domain.vo.DetailArticleVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author 谭继好
 * @Description 大多数页面只获取简要的博客信息，点进去才能看到具体的博客
 *
 * @date 2024-04-09 09:30
 */
@Mapper
public interface BriefArticleDAO {

    // 这里传入用户ID是为了查询是否点过赞以及收藏过，便于页面展示
    List<BriefArticleVO> selectAll(Integer userId);

    // 查询某用户发表的博客
    List<BriefArticleVO> selectByUser(Integer id);

    // 查出来用户发表所有博客ID，用于删除点赞关系
    List<Integer> selectIdByUser(Integer id);

    // 通过标题模糊查询，type属性表示不同分类下的查询
    List<BriefArticleVO> selectByTitle(ArticleSelectDTO data);

    // 类似回收站的功能，查询已经删除的博客
    List<BriefArticleVO> selectDeleted(Integer userId);

    // 查询用户点赞的博客
    List<BriefArticleVO> selectLikeByUser(Integer userId);

    // 查询用户收藏的博客
    List<BriefArticleVO> selectCollectByUser(Integer userId);

    // 这里的SQL语句不能带deleted = 0，删除（隐藏）的博客查不出来
    BriefArticleVO selectByArticleId(@Param("userId") Integer userId, @Param("articleId") Integer articleId);

    List<BriefArticleVO> selectByUserName(DetailInfoDTO data);

    List<BriefArticleVO> getByTitleLike(DetailInfoDTO data);

    List<BriefArticleVO> getByTitleCollect(DetailInfoDTO data);

    DetailArticleVO selectUpdateDetail(Integer articleId);

    void insert(BriefArticle article);

    // 修改标题时调用，调用次数较少。这里只传递必要参数
    void changeInfo(DetailInfoDTO data);

    // 修改博客的点赞以及收藏数量，调用频繁，单独列出
    void changeNum(ChangeNumDTO data);

    // 修改标志位，查不到对应博客，便于后续恢复
    void hide(Integer id);

    // 修改标志位，使博客可见
    void recover(Integer articleId);

    // 真正删除对应文章
    void delete(Integer id);

    // 与上面同理
    void deleteAll(Integer userId);

}
